package sad.dao;

import com.db4o.ObjectSet;
import com.db4o.query.Query;
import sad.modelo.Professor;
import sad.util.Constantes;
import sad.util.DAOEvent;
import sad.visao.ProfessorTableModel;

public class ProfessorTableDAO extends AbstractDAO {
    
  private static ProfessorTableDAO INSTANCE=null;
  private static ProfessorTableModel tableModel;
  private static int indexProf;
  
  public static ProfessorTableDAO getInstance(){
        if (ProfessorTableDAO.INSTANCE ==null){
            ProfessorTableDAO.INSTANCE = new ProfessorTableDAO();
        }
        return ProfessorTableDAO.INSTANCE;
    }
    
  //C(reate)R(etrieve)U(pdate)D(elete)

  public static void createTableProf(){
        //Cria uma nova tabela de professores
        tableModel = new ProfessorTableModel();
        Query query = DAO.getObjectContainer().query();
        //Faz a busca no DAO e organiza pelo nome
        query.constrain(Professor.class);
        query.descend("nome").orderAscending();
        ObjectSet produtoList = query.execute();
        //add todos os professores na tabela
        while(produtoList.hasNext()) {
            Professor proto = (Professor)produtoList.next();
            tableModel.addProfessor(proto);
        }
        //organiza pelo nome
        tableModel.sortByNome();
  }

  public void create(String nome,
                          String login,
                          String senha){
        //Cria um novo professor com os dados
        Professor p = new Professor();
        p.setNome(nome);
        p.setLogin(login);
        p.setSenha(senha);
        //Se foi tudo criado e armazenado OK no Banco, add Prof na tabela
        if(DAO.create(p)){
            addProfessor(p);
        } else {
            //avisa que deu problema no Banco
            ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p, p.getLogin(), DAOEvent.DAO_NOCREATE));
        }
  }
  
    public void addProfessor(Professor p) {
        //verifica se o primeiro professor foi adicionado e avisa aos ouvintes
        //sadgui deve habilitar menu disciplina
        int size = DAO.getListObjects(p).length;
        if(size==1){
                ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.DISCIPLINA, DAOEvent.DAO_FIRST));
        }
        //se existe uma tabela
        if (tableModel!=null){
            //add prof
            tableModel.addProfessor(p);
            //organiza pelo nome
            tableModel.sortByNome();
        }
        //avisa aos ouvintes que um professor foi criado com sucesso
        ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p, p.getLogin(), DAOEvent.DAO_CREATE));
    }
    
    public boolean isExist(String login) {
        boolean existe = false;
        //verifica se existe um professor com esse login
        if(login!=null){
            Professor proto = new Professor();
            proto.setLogin(login);
            //busca o professor com "login"
            Professor p = (Professor)DAO.retrieve(proto);
            //se existe o prof
            if(p != null){
               existe =true;
               //avisa aos ouvintes que o prof já existe
               ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p, p.getLogin(), DAOEvent.DAO_EXISTE));
            }
        }
        return existe;
    }

    public static Professor getProfessorSaved(String login) {
        //retorna o professor que tenha esse "login"
        Professor proto = new Professor();
        proto.setLogin(login);
        return (Professor) DAO.retrieve(proto);
    }

    public ProfessorTableModel getTableProfessor() {
        return tableModel;
    }

    public void removeProfessor() {
        Professor p = tableModel.getProfessor(getIndexProf());
        ProfessorTableDAO.getInstance().delete(p);
        tableModel.removeProfessor(getIndexProf());
        //verifica se todos os professores foram apagados 
        //avisa para GUI desabilidar menu disciplina
        if(tableModel.getRowCount()==0){
            ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.DISCIPLINA, DAOEvent.DAO_NULL));
        }
        //avisa aos ouvintes da lista que um professor foi apagado
        ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p, DAOEvent.DAO_DELETE));
    }
    
    public void setIndexProf(int index) {
        //seta o index do prof selecionado na tabela
        indexProf=index;
    }
    
    public int getIndexProf() {
        //retorna o index do prof selecionada na tabela
        return indexProf;
    }
    
    public void update(Professor p){
        //atualiza o banco (create igual a update)
        if(DAO.create(p)){
            //atualiza os valores editados na tabela
            tableModel.setValueAt(p, getIndexProf(), 0);
            tableModel.setValueAt(p, getIndexProf(), 1);
            tableModel.setValueAt(p, getIndexProf(), 2);
            tableModel.sortByNome();
            //avisa a gui da atualização
            ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p.getLogin(), DAOEvent.DAO_UPDATE));
        }else{
            ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(p.getLogin(), DAOEvent.DAO_NOCREATE));
        }
    }
}